#ifndef STATEMACHINE_H_
#define STATEMACHINE_H_

#include <vector>

#include "./States.h"
#include "./ChangeListener.h"

namespace Core {
namespace GameState {

/*
 * Klasa obsluguje maszyne stanow gry. Pozwala dodawac sluchaczy zmian stanu gry, a takze realizuje
 * podstawowa funkcjonalnosc zwiazana ze zmianami stanow.
 */
class StateMachine {
	typedef std::vector< ChangeListener* > ListenersContainer;
	typedef ListenersContainer::iterator ListenersIter;
	ListenersContainer listeners_;
	States state_;

	/* Powiadamia sluchaczy o zmianie stanu na state. */
	void notifyListeners( States state ) {
		for( ListenersIter iter = listeners_.begin(); iter != listeners_.end(); iter++ )
			(*iter)->notifyGameStateChange( state );
	};

	StateMachine() :
		state_( gsAny )
	{};

public:
	static StateMachine& getInstance() {
		static StateMachine instance;
		return instance;
	};

	/* Dodaje sluchacza zmiany stanu. */
	void addGameStateChangeListener( ChangeListener* listener ) {
		listeners_.push_back( listener );
	};

	/* Usuwa sluchacza zmiany stanu. */
	void removeGameStateChangeListener( ChangeListener* listener ) {
		//listeners_.erase( listener );
	};

	/* Ustawia stan na state, wykonujac rownoczesnie akcje zwiazane z przejsciem. */
	void setState( States state ) {
		state_ = state;
		notifyListeners( state );
	};

	/* Pozwala pobrac aktualny stan gry. */
	States getState() {
		return state_;
	}

}; //class StateMachine

} //namespace GameState
} //namespace Core

#endif /* STATEMACHINE_H_ */
